package CasosTestIntra;

public class D {

    private D next;
    private D prev;

    /**
     * Test 01
     *
     * write
     */
    public void m_01(D x) {
        D y = new D();
        x.next = y;
        // R is empty? SI
        // E is empty? NO
    }

    /**
     * Test 02
     *
     * read
     */
    public void m_02(D x) {
        D y;
        y = x.next;
        y.next = x;
        // R is empty? NO
        // may_reach(x,next).has(x)? SI
    }

    /**
     * Test 03
     *
     * 2 locations / write
     */
    public void m_03(D x, D y) {
        x.next = y;
        y.prev = x;
        // R is empty? SI
        // may_reach(x,next+prev).has(x)? SI
        // x may-alias y? SI
        // may_reach(x,next).has(x)? SI
    }

    /**
     * Test 04
     *
     * 3 locations / write
     */
    public void m_04(D x, D y) {
        x.next = y;
        y.prev = x;

        D z = new D();
        x.next = z;
        z.prev = x;
        // R is empty? SI
        // may_reach(y,next+prev).has(z)? SI
        // may_reach(z,next).has(x)? NO

    }

    /**
     * Test 05
     *
     * branch
     */
    public void m_05(D x, D y) {

        if (x == y) {
            x.next = x;
            y.prev = y;
        } else {
            x.next = y;
            y.prev = x;
        }
        // R is empty? SI
        // may_reach(x,next+prev).has(x)? SI
        // x may-alias y? SI
        // may_reach(x,next).has(x)? SI

    }

    /**
     * Test 06
     *
     * escape
     */
    public D m_06(D x) {
        D y = new D();
        y.next = x;
        return x;
        // el objeto creado en la linea 70 escapa? NO
        // (es alcanzable desde el return o un parametro)
    }
}
